package com.ztrue.framework.handler.definition;

import com.ztrue.framework.exception.ArgumentNullException;

/**
 * 表示一个用于处理器定义
 *
 * @author zhangw
 * @date 2016/11/9 17:47
 * @version: 1.0
 */
public abstract class AbstractHandlerDefinition implements IHandlerDefinition {
    /**
     * 处理器Class
     */
    private Class handlerClass;
    /**
     * 处理器类型
     */
    private HandlerGenre handlerGenre;
    /**
     * 处理目标Class
     */
    private Class handlerTargetClass;
    /**
     * 是否异步
     */
    private boolean async;
    /**
     * 处理器作业模式
     */
    protected HandlerOperationMode operationMode;

    /**
     * 初始化一个处理器定义
     */
    public AbstractHandlerDefinition() {
        this.operationMode = HandlerOperationMode.CLASS;
    }

    /**
     * 获取处理器Class
     *
     * @return
     */
    @Override
    public Class getHandlerClass() {
        return this.handlerClass;
    }

    /**
     * 设置处理器Class
     *
     * @param cls
     */
    public void setHandlerClass(Class cls) {
        this.handlerClass = cls;
    }

    /**
     * 获取处理器Class Name
     *
     * @return
     */
    @Override
    public String getHandlerClassName() {
        if (this.handlerClass == null) throw new ArgumentNullException("无效的处理器类型");
        return this.handlerClass.getName();
    }

    /**
     * 获取处理器类型
     *
     * @return
     */
    @Override
    public HandlerGenre getHandlerGenre() {
        return this.handlerGenre;
    }

    /**
     * 设置处理器类型
     *
     * @param handlerGenre
     */
    protected void setHandlerGenre(HandlerGenre handlerGenre) {
        this.handlerGenre = handlerGenre;
    }

    /**
     * 获取处理目标Class
     *
     * @return
     */
    @Override
    public Class getHandlerTargetClass() {
        return this.handlerTargetClass;
    }

    /**
     * 设置处理目标Class
     *
     * @param cls
     */
    public void setHandlerTargetClass(Class cls) {
        this.handlerTargetClass = cls;
    }

    /**
     * 获取处理目标Class Name
     *
     * @return
     */
    @Override
    public String getHandlerTargetClassName() {
        if (this.handlerTargetClass == null) throw new ArgumentNullException("无效的处理目标类型");
        return this.handlerTargetClass.getName();
    }

    /**
     * 是否异步执行
     *
     * @return
     */
    @Override
    public boolean isAsync() {
        return async;
    }

    /**
     * 设置处理器是否为异步执行
     *
     * @param bl
     */
    public void setAsync(boolean bl) {
        this.async = bl;
    }

    /**
     * 获取作业模式
     *
     * @return
     */
    @Override
    public HandlerOperationMode getOperationMode() {
        return operationMode;
    }
}